{% extends "base.html" %} {% from "_when.html" import when_field with context %} {% block title %}{{ hs.name }} ยท {{ app_name }}{% endblock %} {% block body %}

๐Ÿพ Your {{ hs.name }} โš™

โ€œ{{ hs.line }}โ€

{% if hs.challenge %}{% include "challenge_form.html" %}{% endif %} {#- The blank pages the audit is still holding, and the one door back (handler.catch_up). ๐Ÿ”ด It sits above everything else on purpose: before it existed there was no way to answer a missed day at all, and the lapse questions kept asking for pages nobody could write. -#} {% if hs.pages %}{% set n = hs.pages|length %}

๐Ÿ—’ Catch up {{ n }} blank page{{ 's' if n != 1 }} your {{ hs.name }} is still holding

{% for p in hs.pages %}๐Ÿ“„ {{ p.label }}{% endfor %}

{{ catchup_q }}

one entry answers every page ยท at least {{ minchars }} characters ยท no xp ยท each ๐Ÿ“„ Blank page (2) becomes a ๐Ÿ“ Late page (1) for the rest of its week ยท the days stay blank on the calendar, and the time already added stays

{% endif %} {#- What somebody else said to you today โ€” the AI's line, a pack Handler's. The rules line above always stands. ๐Ÿ”ด A line about time while your lock is hidden shows masked; it is theirs and stored verbatim, and it is yours to reveal here, never shown by default. -#} {% for key in ('pack_line', 'ai_line') %}{% set l = hs[key] %}{% if l %}

{{ l.label }} {{ l.ts|rel(now) }}

{% if l.masked and not reveal %}

{{ l.text }} tap to reveal

{% else %}

โ€œ{{ l.raw if (l.masked and reveal) else l.text }}โ€

{% endif %}
{% endif %}{% endfor %} {% include "mischief_panel.html" ignore missing %} {% if hs.habits %}

On your habits the work your {{ hs.name }} is watching habits โ†’

โ€œ{{ hs.habits.line }}โ€

{% for v in hs.habits.verdicts %}{{ v.icon }} {{ v.title }} ยท {{ v.state|replace('_', ' ') }}{% endfor %}

Consistency earns praise, XP and time off the clock. Slacking earns a word โ€” and minutes on, if you turned that on in Settings โ†’ Habits. Too new to judge is a state too: nothing is said about a habit in its first week.

{% endif %}

Today's reflection {{ 'done' if hs.reflected else 'required ยท due ' ~ hs.due_hour ~ ':00' }}

{% if hs.reflection_prompt %}

{% if hs.reflection_prompt.lapse %}{{ hs.reflection_prompt.lapse.icon }} {{ hs.reflection_prompt.lapse.label }} {% endif %}{{ hs.reflection_prompt.text }}{% if hs.pages and hs.reflection_prompt.lapse and hs.reflection_prompt.lapse.why == 'blank_page' %} ๐Ÿ—’ catch the pages up โ†’{% endif %}

{% endif %}

at least {{ minchars }} characters ยท +15 xp

{{ when_field('โฑ wrote this earlier? set the time') }}
โ€”

at least {{ voice_min }} seconds ยท +15 xp ยท stays on this box

Check-in {% if not hs.active %}only while locked{% elif hs.checkin.overdue %}overdue{% elif hs.checkin.due %}due now{% else %}next {{ hs.checkin.next_at|rel(now) }}{% endif %}

{% for k in score_keys %} {% endfor %} {% if hs.checkin_prompt %}

{% if hs.checkin_prompt.lapse %}{{ hs.checkin_prompt.lapse.icon }} {{ hs.checkin_prompt.lapse.label }} {% endif %}{{ hs.checkin_prompt.text }}{% if hs.pages and hs.checkin_prompt.lapse and hs.checkin_prompt.lapse.why == 'blank_page' %} ๐Ÿ—’ catch up โ†’{% endif %}

{% endif %} {{ when_field() }}

Mantra of the day {{ 'recited' if hs.recited else 'say it out loud' }}

{% if hs.mantra %}

{{ hs.mantra.text }}

{% if mantra_audio %}๐ŸŒ€ play it{% endif %}
{% endif %}
all mantras
    {% for m in mantras %}
  • {{ m.text }}
  • {% endfor %}

Affirmations

Headspace session meditation ยท hypno scripts later

โ€”
{{ when_field('โฑ sat earlier, off-app? set the time and log it') }}

xp = minutes, up to 20. The log button unlocks when the timer ends โ€” sit the whole thing. Logging an earlier session unlocks it too.

Journal

{% endblock %} {% block scripts %} {% endblock %}